#include "../include/socketmanager.h"

SocketManager* SocketManager::instance=nullptr;

SocketManager *SocketManager::getInstacne()
{
    if(instance==nullptr)
    {
        instance=new SocketManager();
    }
    return instance;
}

void SocketManager::addSocket(std::string& useroc, int socket)
{
    if(useroc.empty()||socket<=0)
    {
        perror("invalid addsocket");
        return;
    }
    mtx.lock();
    oc_socket.insert({useroc,socket});
    socket_oc.insert({socket,useroc});
    mtx.unlock();
}

void SocketManager::removeSocket(std::string& useroc)
{
    if(useroc.empty()||oc_socket.find(useroc)==oc_socket.end())
    {
        perror("invalid removeSocket");
        return;
    }
    mtx.lock();
    int socket=oc_socket[useroc];
    oc_socket.erase(useroc);
    socket_oc.erase(socket);
    mtx.unlock();
}

void SocketManager::removeSocket(int socket)
{
    if(socket_oc.find(socket)==socket_oc.end())
    {
        perror("invalid removeSocket");
        return;
    }
    mtx.lock();
    std::string useroc=socket_oc[socket];
    oc_socket.erase(useroc);
    socket_oc.erase(socket);
    mtx.unlock();
}

bool SocketManager::isAlive(std::string& useroc)
{
    if(useroc.empty())
    {
        perror("invalid isAlive");
        return false;
    }
    return oc_socket.find(useroc)!=oc_socket.end();
}

int SocketManager::getSocket(std::string &useroc)
{
    if(useroc.empty()||oc_socket.find(useroc)==oc_socket.end())
    {
        perror("invalid getSocket");
        return -1;
    }
    return oc_socket[useroc];
}

void SocketManager::updateOC(const std::string &oldoc, const std::string &newoc)
{
    int socket=oc_socket[oldoc];
    oc_socket.erase(oldoc);
    oc_socket.insert({newoc,socket});

    socket_oc[socket]=newoc;
}

int SocketManager::operator[](const std::string &useroc)
{
    if(useroc.empty()||oc_socket.find(useroc)==oc_socket.end())
    {
        perror("invalid getSocket");
        return -1;
    }
    return oc_socket[useroc];
}

SocketManager::SocketManager()
{

}
